热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

老肖语录|使用Docker做CI解惑

我今天看到一篇网友分享的php环境下的Docker持续集成案例。笔者大胆的试用后尝到了容器技术的甜头,也在文中提出了一个没有解决的困惑。原来他是把代码放在容器外面&#

我今天看到一篇网友分享的 php 环境下的Docker持续集成案例。笔者大胆的试用后尝到了容器技术的甜头,也在文中提出了一个没有解决的困惑。 原来他是把代码放在容器外面,通过挂载目录的方法把代码加到容器里面运行的。这样虽然跑起来很快,但笔者感觉这和 Docker 的口号 build、ship、run 还是有很大的区别。当然,他把代码放在镜像里,每次变动都需要花上十几分钟等镜像build,push 到仓库后才能run发布,这个过程笔者也接受不了。这个网友的疑惑是构建镜像本身拖慢了集成的速度,这和一般情况下采用新技术能提高生产力的故事在直觉上是说不通的。

我想提提自己的看法。首先,Docker镜像本身是一个压缩包,每次即使只改几个文件,也需要把整个项目压缩一遍,没法增量压缩。所以,如果你的开发过程中需要频繁的改内容的时候,用 Docker 先打镜像再发布的流程就是一种反作用力,直接降低你的生产力。这个时候,你巧借 Docker 容器的环境一致性,直接把源码挂载到容器里面运行的做法应该是一个好办法。

我也意识到 Docker 对 CI这一块并没有考虑那么周到,还是需要我们自己来解决遇到的问题。比如本地的测试,可以考虑使用 vagrant 来解决,如下面的例子,很巧妙:

图片描述

如果我们把 CI 的问题再扩展到 CD,上面源码是否放到镜像里面,仍然有很多可以讨论的地方。对于 Docker 的 build,ship,run一样有很多冲突,我是这么理解的:

  1. build过程,从Docker 宣传的口号来说,源码作为服务组件的组成部分,确实应该放在镜像当中。但是,在没有 Docker之前,我们的源码也是打包的,这方面系统方面的安装包已经足够强大。但之前的安装包一定是需要你编写依赖环境的,每一种系统要写一个 spec。在有了 Docker 之后,这个困难就没有了。因为,你的依赖环境就在镜像里面,不需要额外的考虑环境的变化。所以,代码挂载进来也不会影响环境。

  2. ship 是为镜像仓库为中心,你可以把 镜像存到仓库里面,也可以把镜像拉在主机上。代码作为经常变化的部分,并不能把镜像作为不可变的组件特性给发挥到极致。所以,源码在镜像里面打包分发也不一定是好事。

  3. run 的部分是秒开应用以及依赖的环境。把源码打包到镜像里面后,Run 新版本的镜像,就需要 stop 老镜像。毕竟有一个停起的过程,如果没有灰度发布的过程,这个更新镜像的过程就是中断服务的。

图片描述
上面的困惑虽然小,也能让我们看到 Docker 的使用是需要花心思的。盲从的乱用 Docker 并不能给你带来甜头,反而会让你更烦恼。希望大家一起探讨起来,一起发现一些困惑,一起来探讨解决。

肖德时先生现任数人云CTO,在数人云负责下一代DCOS组件的选型和整合,让众多DCOS
组件能无缝连接,提供支持微服务架构下轻量级PaaS平台。

肖德时先生曾就职于多家知名IT公司,擅长企业级工具软件的设计及实现,拥有十五年计算机行业从业经验。2010年肖德时先生加入Redhat,担任内部工作组Team
Leader。

”老肖语录“是肖德时先生推出的个人公众号栏目,他利用这个公众号记录自己创业路上的点点滴滴,不时会有精彩的技术感悟与分享,欢迎大家关注。




推荐阅读
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 利用Selenium框架解决SSO单点登录接口无法返回Token的问题
    针对接口自动化测试中遇到的SSO单点登录系统不支持通过API接口返回Token的问题,本文提供了一种解决方案,即通过UI自动化工具Selenium模拟用户登录过程,从浏览器的localStorage或sessionStorage中提取Token。 ... [详细]
  • 本文探讨了如何利用伸展树(Splay Tree)来高效地处理区间操作,包括区间修改、查询和删除等。通过引入size域,伸展树能够灵活应对序列结构的变化。 ... [详细]
  • 深入理解Java类加载机制及安全防护
    本文探讨了Java类加载的过程,包括加载、验证、准备、解析和初始化五个阶段,并详细解释了每个阶段的具体操作和意义。此外,文章还讨论了Java如何通过双亲委派模型来保障核心API的安全性,以及在特定情况下如何打破这一机制。 ... [详细]
  • 点击上方“中兴开发者社区”,关注我们每天读一篇一线开发者原创好文DevOps微课系列旨在帮助用户学习DevOps实践。1概述    本文详细介绍一般开发人员使用Gerrit代码评审 ... [详细]
  • 解析 HTTP 头 'Vary: Accept-Encoding' 的作用与重要性
    本文详细探讨了 'Vary: Accept-Encoding' HTTP 头的作用,即指导缓存系统(如代理服务器和 CDN)根据不同的编码需求存储和提供适当的资源版本,确保不同类型的客户端能够接收到适合自己的内容。 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • 本文旨在探讨如何撰写高效且全面的工作总结,特别是针对数据库管理、Java编程及Spring框架的学习与应用。文章通过实例分析,帮助读者掌握工作总结的写作技巧,提高个人工作汇报的质量。 ... [详细]
  • Golang与微服务架构:构建高效微服务
    本文探讨了Golang在微服务架构中的应用,包括Golang的基本概念、微服务开发的优势、常用开发工具以及具体实践案例。 ... [详细]
  • electronvue使用electronupdater实现自动更新
    今天呢,给大家带来一篇干货满满的electron-vue自动升级的教程,话不多说,开始我的表演!配置文件package.jsonbu ... [详细]
  • 基于Flutter实现风车加载组件的制作_Android
    Flutter官方提供了诸如 CircularProgressIndicator和 LinearProgressIndicator两种常见的加载指示组件,但是说实话,实在太普通,所 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
author-avatar
腾云溪牛_556
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有